package designpattern;

/**
 * 抽象工厂的实现
 * 1. 简介
 * 在抽象工厂模式中,接口负责创建一个对象的工厂,
 * 主要使用在系统的产品有多个产品族，但只需要消费其中一个产品时
 * 2. 优点
 * 在产品族中多个对象被设计在一起工作时，能保证客户端只是用一个产品族中的对象
 * 3. 缺点
 * 产品族拓展困难
 * 4. 注意
 * 产品族南扩展，产品等级易扩展
 * 5. 实现步骤
 * // 1. 创建一个接口Shape
 * // 2. 创建实现接口的实体类(Rectangle2,Circle2)
 * // 3. 创建新的接口Color
 * // 4. 创建新的接口的实现类
 * // 5. 为Color和Shape对象创建抽象类来获取工厂
 * // 6. 创建扩展的工厂类
 * // 7. 创建工厂构造器
 * // 8. 使用FactoryProducer来获取对应的工厂
 */
public class AbstarctFactoryTest {
    public static void main(String[] args) {

        // 1. 获取形状工厂
        AbstractFactory shape = FactoryProducer.getFactory("SHAPE");
        // 2. 获取形状为 Circle 的对象
        Shape2 circle = shape.getShapeObject("CIRCLE");
        // 3. 调用 Circle 的 draw 方法
        circle.draw();

        AbstractFactory color = FactoryProducer.getFactory("COLOR");
    }

}

// 1. 创建一个接口Shape
interface Shape2 {
    void draw();
}

// 2. 创建实现接口的实体类
class Rectangle2 implements Shape2 {

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

// 2. 创建实现接口的实体类
class Circle2 implements Shape2 {

    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

// 3. 创建新的接口Color
interface Color {
    void fill();
}

// 4. 创建新的接口的实现类
class Red implements Color {

    @Override
    public void fill() {
        System.out.println("Inside Red::fill() method.");
    }
}

// 4. 创建新的接口的实现类
class Green implements Color {

    @Override
    public void fill() {
        System.out.println("Inside Green::fill() method.");
    }
}

//5. 为Color和Shape对象创建抽象类来获取工厂
abstract class AbstractFactory {
    public abstract Color getColorObject(String color);

    public abstract Shape2 getShapeObject(String shape);
}

//6. 创建扩展的工厂类
class ShapeFactory2 extends AbstractFactory {
    @Override
    public Shape2 getShapeObject(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle2();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle2();
        }
        return null;
    }

    @Override
    public Color getColorObject(String color) {
        return null;
    }
}

//6. 创建扩展的工厂类
class ColorFactory extends AbstractFactory {

    @Override
    public Shape2 getShapeObject(String shapeType) {
        return null;
    }

    @Override
    public Color getColorObject(String color) {
        if (color == null) {
            return null;
        }
        if (color.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (color.equalsIgnoreCase("GREEN")) {
            return new Green();
        }
        return null;
    }
}

//7. 创建工厂构造器
class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory2();
        } else if (choice.equalsIgnoreCase("COLOR")) {
            return new ColorFactory();
        }
        return null;
    }
}

